perm filename FUNC.F4[MUS,LCS]1 blob sn#080733 filedate 1974-01-08 generic text, type T, neo UTF8
00100	C  THIS PROGRAM CREATES FUNCTIONS FOR THE MUSIC PROGRAM USING 
00200	C  'SEG' OR 'SYNTH'.  UP TO 10 FUNCTIONS CAN BE STORED IN A
00300	C  SINGLE FILE.  ONCE CREATED, THE FUNCTIONS MAY BE CHANGED
00400	C  AND PUT BACK IN THE SAME FILE OR INTO A NEW ONE.
00500	C  NO MORE THAN 50 INPUTS FOR ONE FUNCTION!
00600	C  TYPE 'C' (= CRUNCH)  FOR SPECIAL FEATURE SUBR.
00605	C  'Z' FOR "CHANGE OR FINISH?" WILL JUMP DIRECTLY TO "CRUNCH" MODE.
00610	C  WITH S(EE), <CR> WILL REPEAT SEE COMMAND WITHOUT ASKING FOR FILE.
00620	C  'SP' (FOR "SEE") WILL PLOT ONE AT A TIME.
00625	C  'SA' PLOTS ALL IN .DAT FILE ON CALCOMP
00627	C  'SX' PLOTS ALL IN XGP FORMAT. (1ST→ <CTRL C>, A DSK PTP  --
00628	C -- WHEN DONE→ <CTRL C>, F )  THEN USE "X" PROG. TYPE 6,11,1.
00630	C FOR EXPONENTIALS GET INTO 'SEG'.  TYPE 'X', DECAY FAC, N.  IF 
00640	C  N IS NON-ZERO THE FUNCTION WILL NOT! NORMALIZE (IE. NOT GO TO 0).
00650	C  AFTER A FILE HAS BEEN READ IN, 
00750	C  <CR> FOR 'TYPE FILE' WILL HOLD ON TO IT.
00900	C  LOAD WITH -- WRIFUN,FUSUB,DFUNC,CURSOR,SSS,%LTVRLIB[1,TVR]
01000		COMMON/LN/LINE
01100		COMMON/S/H,AMP,CON,PH
01200		COMMON/RD/ A(50,4),B(2,10),FN(10),XA(10),AA(4,178,10)
01300		1,LX,JX,JT,IDEL,FNUM,FNUM1,Z,FLNM,FLNM1,KT
01400		COMMON FUNC(512),F2(512),K,I
01500		DIMENSION RF(4)
01700	21	FORMAT(' C=CHANGE, F=FINISH  '$)
01800	22	FORMAT(' NEW FUNC, EDIT, CRUNCH, DELETE, RENAME, SEE?   '$)
01900	23	FORMAT(' SEG OR SYNTH?   '$)
02000	24	FORMAT(' TYPE FUNCTION NAME   '$)
02100	25	FORMAT(' TYPE FILE NAME   '$)
02200	26	FORMAT(I3,') TYPE AMPL, STEP# -- OR L=LTPEN   '$)
02300	C  'X' HERE WILL MAKE EXPON. FUNC.
02400	28	FORMAT(' 0=NORM,OR H,A,P,K   '$)
02500	280	FORMAT(' NEW VERSION!  --REPORT ANY PROBLEMS TO LCS'/
02600		1' UP TO 10 FUNCTIONS MAY BE STORED IN EACH FILE'/
02700		1' TYPE "B" TO BACKUP AT ANY TIME'//)
02800	30	FORMAT(8F)
02900	31	FORMAT(1XA5,A1,5A5/)
03000	34	FORMAT(A5,'(',A5,');',A5)
03100	35	FORMAT(1XA5,'IN FILE "',A5,'.DAT"'/)
03200	37	FORMAT(8F9.3)
03300	371	FORMAT(I3,') ',4F8.2)
03400	372	FORMAT(I,21F)
03500	38	FORMAT(2(A5,A1),23A2)
03800	40	FORMAT(11(A1,A3))
03900	41	FORMAT(' ADD TO AN EXISTING FILE?   '$)
04000	42	FORMAT(' WHICH FUNC?   '$)
04300	47	FORMAT(' C=CHNG, I=INSRT, D=DEL -- + LN# & CHNGS '$)
04400	48	FORMAT(' X,N(=DECAY FAC.) FOR XPONTLS')
04700	2281	TYPE 280
04800	281	KZ=0
04900	C   USED IN RELATIVE VECTOR ROUTINE
05000		Z=0
05050		XZ=0
05100		EY=0
05200		ICUR=0
05300		XP=0
05350		KT=0
05400		FNUM=0
05500		OLD=0
05600		FNUM1=0
05700		TYPE 22
05800		ACCEPT 40,ON,P
05900	1281	IPLOT=0
05910		XDPY=-1
06000		IF(ON.EQ.'N'.OR.(ON.EQ.' '.AND.ONX.NE.'S'))GO TO 1000
06100		IF(ON.NE.' ')GO TO 100
06200		ON=ONX
06250		XDPY=0
06275	C  <CR> FOR 'SEE' WILL DISPLAY UP TO 3 FUNCS AT ONCE.
06300	C  RETURNS FOR MORE "SEE"
06400		GO TO 4281
06500	100	ONX=ON
06600		TYPE 25
06700		OLD=-1
06800		ACCEPT 38,FLNM1
06900		IF(FLNM1.EQ.' ')FLNM1=FLNM
06950		IF(FLNM1.EQ.0.OR.LOOKD(FLNM1).EQ.0)GO TO 100
07000		IF(FLNM.NE.FLNM1)GO TO 2151
07100		OLD=0
07200	4281	TYPE 40,B
07300		GO TO 1402
07400	2151	FLNM=FLNM1
07500		CALL READ1
08200	3402	JX=-1
08300		LX=0
08310		IF(P.EQ.'A'.OR.P.EQ.'X')GO TO 402
08320	C  "SA" WILL PLOT ALL FUNCS IN FILE
08400		TYPE 40,B
08500		IF(B(1,2).NE.' ')GO TO 1402
08600		FNUM1=B(2,1)
08700	C  ONLY ONE FUNC IN FILE.
08800		GO TO 402
08900	1402	TYPE 42
09000		ACCEPT 40,BU
09100		IF(BU.EQ.'B')GO TO 281
09200		REREAD 38,FNUM1
09300		IDEL=0
09400	C  LX IS MAIN COUNTER
09500		IF(OLD)GO TO 402
09600		DO 1302 JX=1,10
09700	1302	IF(FNUM1.EQ.FN(JX))GO TO 5402
09800		GO TO 3402
09900	402	CALL READER
09910	C  AT THIS POINT LX=TOTAL FUNCS+1
09920	5402	IF(P.EQ.'A'.OR.P.EQ.'X')JX=1
10000	1202	IF(ON.NE.'C'.AND.ON.NE.'S'.AND.ON.NE.'D')GO TO 3281
10100		IF(XDPY)CALL DPYX(1)
10150		CALL DPYF(JX,FUNC)
10200		IF(P.EQ.'A'.OR.P.EQ.'X'.OR.P.EQ.'P'.OR.P.EQ.0)GO TO 2202
10300		IF(ON.EQ.'S')GO TO 2281
10400		IF(ON.EQ.'C')GO TO 1201
10500		TYPE 1139
10525		ACCEPT 40,IDEL
10550		IF(IDEL.EQ.'N')GO TO 2281
10575		IDEL=JX
10600		LX=LX-1
10630	C  NOW LX=TOTAL # OF FUNCS.
10640		CALL WRIFUN
10650	1139	FORMAT(' DELETE IT? ',$)
10675	2202	CALL PLOTIT(FUNC,XA(JX),P)
10687		IF(P.EQ.'P')GO TO 2281
10700		JX=JX+1
10710		IF(B(2,JX).NE.' '.AND.JX.LE.10)GO TO 1202
10720	C  "SA" KEEPS PLOTTING UNTIL NO MORE ARE FOUND
10730		GO TO 2281
10790	3281	X=' '
10800		TYPE 31,XA(JX),X,FN(JX)
10900		JT=4
11000		IF(XA(JX).EQ.'SEG')JT=2
11100		KZ=1
11200		DO 137	K=1,50
11300		KZ=KZ+1
11400		DO 138 L=1,JT
11500	138	A(K,L)=AA(L,K,JX)
11600	137	IF(A(K,1).EQ.999.OR.A(K,2).GE.100)GO TO 4401
12700	
12800	4401	Z=-1
12900		IF(A(K,2).LE.100)GO TO 4403
13000		IF(K.GT.1)GO TO 4404
13100		CALL DPYX(1)
13200		CALL DPYF(JX,FUNC)
14000		IF(ON.EQ.'R')GO TO 3032
14100		TYPE 4405
14120		A(1,2)=520
14250		GO TO 4201
14300	4404	TYPE 4402
14400	4403	IF(JT.EQ.2)EY='EG'
14500		GO TO 1032
14800	4402	FORMAT('  IT WAS SMOOTHED.')
14900	4405	FORMAT(' CANNOT EDIT CRUNCHED FUNCS.'/)
15000	1000	TYPE 23
15100		ACCEPT 40,BU
15200		IF(BU.EQ.'B')GO TO 281
15300		REREAD 40,X,EY
15400	1032	CALL ZERO(FUNC)
15600	C  CLEARS THE FUNC.
15700		ISMOO=0
15800		IF(EY.EQ.'EG')GO TO 800
15900	151	EY=0
16000		JT=4
16100	C  FOR WRIFUN
16200	1031	CALL DPYX(1)
16300	15	KT=1
16400	104	IF(Z.EQ.-1.OR.KT.LT.KZ)GO TO 102
16500		IF(Z.EQ.1)GO TO 2032
16600	1041	KZ=0
16700		TYPE 28
16800		ACCEPT 40,BU
16900		IF(BU.EQ.'B')GO TO 509
17000		REREAD 30,(A(KT,K),K=1,4)
17100	C ACCEPT HARM,AMPL,PHASE,KONSTANT(IF K>100, MULTIPLIES WAVE *(K-100))
17200	102	H=A(KT,1)
17300		IF(H.EQ.0.OR.H.EQ.999.)GO TO 2200
17400	C   999 ENDS 'READIN' SYNTHS
17500		IF(Z.GT.0)TYPE 371,KT,(A(KT,K),K=1,4)
17600		AMP=A(KT,2)
17700		PH=A(KT,3)
17800		CON=A(KT,4)
17900		CALL SYN(FUNC)
18000		KT=KT+1
18100		IF(KZ.LE.KT)CALL DPY(FUNC,1)
18200		GO TO 104
18210	2201	IF(JT.NE.2.OR.A(KT-1,2).GT.100)GO TO 1201
18215	C  TO USE CURRENT FUNC IN CRUNCH
18230		IF(LX.GT.10)GO TO 204
18250		CALL STORE(10)
18260	C  PUTS FROM A ARRAY TO AA ARRAY
18270		XA(K)='SEG'
18275		CALL DPYX(1)
18280		CALL DPYF(K,FUNC)
18400	1201	CALL ZFUNC
18500	C  THIS WILL BE FOR SPECIAL FEATURE PACKAGE
18510		IF(KT.EQ.512)GO TO 2281
18520	C  FOR BACKUP
18540	4201	EY='EG'
18600		KT=2
18650		GO TO 900
18700	2200	CALL NORM(FUNC)
18800	C   NORMALIZES THE FUNCTION
18900		CALL DPY(FUNC,1)
19100	201	IF(BU.EQ.'C')GO TO 2032
19200		IF(ON.EQ.'R')GO TO 3032
19300	204	TYPE 21
19400		IF(EY.EQ.'EG')TYPE 271
19500	C   CHANGE IT?
19600		ACCEPT 40,BU
19700		IF(BU.EQ.'C')GO TO 210
20000		IF(BU.EQ.'F')GO TO 900
20100		IF(BU.EQ.'S')GO TO 7000
20200		IF(BU.EQ.'Z')GO TO 2201
20250	C  TO USE CURRENT FUNC IN CRUNCH
20300		IF(BU.NE.'B')GO TO 2032
20400		IF(EY.EQ.'EG')GO TO 509
20500		GO TO 5091
20600	C   NEXT IS FOR CHANGES ('C' OR <CR>)
21200	2032	TYPE 47
21300		ACCEPT 40,K
21400		REREAD 372,L,X,RF
21500		IF(X.NE.0.OR.RF(1).NE.0)GO TO 211
21600		IF(EY.EQ.'EG')GO TO 204
21700		BU=0
21800		GO TO 1041
21900	211	L=X
22000		IF(K.EQ.'I')GO TO 212
22100		IF(K.NE.'D')GO TO 205
22200	C   JUMP IF NO DELETE
22300		KT=KT-1
22400		DO 209 K=L,KT
22500		DO 209 J=1,4
22600	209	A(K,J)=A(K+1,J)
22700		GO TO 210
22800	205	X=RF(2)
22900		IF(EY.NE.'EG')GO TO 1207
23000		IF(X.GE.A(L+1,2).AND.L.LT.KT-1)GO TO 2032
23100		GO TO 208
23200	212	IF(RF(2).NE.0)GO TO 213
23300		RF(2)=RF(1)
23400		RF(1)=X
23500		L=KT
23600	213	IF(EY.NE.'EG')GO TO 214
23700		X=RF(2)
23800		DO 215 K=1,KT
23900		Y=A(K,2)
24000		IF(X.GT.Y)GO TO 215
24100	C   JUMP IF NOT PAST STEP NUM.
24200		L=K
24300		IF(X.EQ.Y)GO TO 208
24400	C   IF STEP=ANOTHER STEP, IT WORKS LIKE 'C'HANGE.
24500		GO TO 214
24600	215	CONTINUE
24700	214	KT=KT+1
24800		DO 206 K=KT,L,-1
24900		DO 206 J=1,4
25000	206	A(K,J)=A(K-1,J)
25100		GO TO 207
25200	C   TO TYPE OLD NUMBERS
25300	208	IF(X.LE.A(L-1,2).AND.L.GT.1)GO TO 2032
25400	1207	TYPE 371,L,(A(L,K),K=1,4)
25500	207	DO 202 K=1,4
25600	202	A(L,K)=RF(K)
25700	210	KZ=KT
25800		Z=1
25900		GO TO 1032
26000	271	FORMAT('+S=SMOOTH  '$)
26010	C  FOR RENAMES
26040	3032	Z=-1
26070		GO TO 901
26100	900	TYPE 41
26200	C  ADD TO EXISTING FILE
26300		ISKP=0
26400		ACCEPT 40,Z
26500	9000	IF(Z.EQ.'B')GO TO 204
26550		IF(Z.NE.'Y'.AND.Z.NE.'N')GO TO 900
26600		TYPE 25
26700		ACCEPT 38,FLNM
26800		IF(FLNM.EQ.' '.AND.FLNM1.NE.' ')FLNM=FLNM1
26900		IF(FLNM.EQ.'B'.OR.FLNM.EQ.' ')GO TO 204
26950	CC	IF(LOOKD(FLNM).AND.Z.EQ.'N')GO TO 902
26955		IF(LOOKD(FLNM))GO TO 902
26957		IF(Z.NE.'N')GO TO 900
26960	C  LOOKD CHECKS ON LOOK-UP
27000	901	JT=4
27100		IF(EY.EQ.'EG')JT=2
27200		CALL WRIFUN
27300		GO TO 900
27400	C  COMES BACK IF NO ROOM IN FILE FOR NEW FUNC.
27405	902	IF(Z.NE.'N')GO TO 901
27410		TYPE 381,FLNM
27420		ACCEPT 40,Z
27430		IF(Z.NE.'N')GO TO 901
27440		GO TO 9000
27470	381	FORMAT(' WRITE OVER ',A5,'.DAT?  ',$)
27500	
27600	161	DO 261 K=1,512
27700	261	FUNC(K)=EXP((1-K)/STEP)
27800		KT=2
27900		XP=-1
28000		IF(H.NE.0)GO TO 7009
28100	C  H≠0 = NO NORMALIZATION OF XPONTL
28200		X=FUNC(512)
28300		DO 361 K=1,512
28400	361	FUNC(K)=FUNC(K)-(K-1)/511.*X
28500		GO TO 7009
28600	800	IF(XP)GO TO 510
28700		X=0
28800		JT=2
28900	C  JT AND EY SEEM TO PERFORM THE SAME FUNCTIONS??
29000		Y=0
29100		KT=1
29200		N=-256
29300		CALL DPYX(2)
29400		CALL DPYBRT(5)
29700	504	IF(KT.GE.KZ)GO TO 510
29800		AMP=A(KT,1)
29900	5008	STEP=A(KT,2)
30000		IF(STEP.LE.A(KT-1,2).AND.KT.GT.1)GO TO 509
30100	C   SO IT CAN'T GO BACKWARDS
30200		GO TO 5071
30300	434	ICUR=0
30400		CALL CLRCUR
30500		GO TO 510
30600	C   EXIT FROM CURSOR
30700	CC431	CALL SETCUR(-256,128,0)
30750	431	NX=-256
30760		NY=128
30770		NZ=0
30800	C  TYPE <CR> HERE TO SET FIRST POINT AT 0,0
30900		ICUR=-1
30910	433	CALL SETCUR(NX,NY,NZ)
30920		NZ=1
30930	C  =1 TO DRAG ALONG VECTOR
31000		TYPE 432,KT
31100		ACCEPT 40,AB
31200		IF(AB.EQ.'B')GO TO 509
31300		IF(AB.EQ.'R')GO TO 434
31400		MX=NX
31500		MY=NY
31600		CALL RDCUR(NX,NY)
31700	CC	CALL SETCUR(NX,NY,1)
31800		STEP=(NX+256)/5.12
31900		AMP=(NY-128)/256.
32000		IF(KT.EQ.1)STEP=1.
32100		IF(STEP.LT.100)GO TO 5571
32200		AMP=((STEP-100)/(STEP-A(KT-1,2)))*(A(KT-1,1)-AMP)+AMP
32300		ICUR=0
32400		CALL CLRCUR
32500		STEP=100.
32600	5571	TYPE 37,AMP,STEP
32700		GO TO 5071
32800	611	FORMAT(' NO MORE THAN 50 SEGS'/)
32900	610	TYPE 611
33000	509	KT=KT-1
33100	CC	IF(ICUR)CALL SETCUR(MX,MY,1)
33200	5091	IF(KT.LT.1)GO TO 281
33300		GO TO 210
33400	432	FORMAT(I3,') <CR>=SEG, B=BACKUP, R=RETURN  '/)
33500	510	IF(ICUR)GO TO 433
33600		IF(KT.EQ.1)TYPE 48
33700		TYPE 26,KT
33800		KZ=0
33900		ACCEPT 40,BU
34000		IF(BU.EQ.'B')GO TO 509
34100		IF(BU.EQ.'L')GO TO 431
34200	61	REREAD 30,AMP,STEP,H
34300		IF(STEP.LT.1)STEP=1
34400		IF(BU.EQ.'X')GO TO 161
34500	C  TYPE 'X' FOR EXPON. FUNC. + DECAY FACTOR, +1 = NO NORM.
34600	C  WE START WITH STEP 1 (NOT 0)
34700	5071	IF(KT.GT.50)GO TO 610
34800	C   TOO MANY SEGS
34900		IF(Z.GT.0)TYPE 371,KT,AMP,STEP
35000		IF(STEP.GT.100)STEP=100
35200		DIF=AMP-Y
35400		IF(STEP-X.LE.0.AND.KT.NE.1)GO TO 504
35500	C   SO IT CAN'T BACKUP HERE
35700		IF(STEP.LE.1.)Y=AMP
35710	203	YSTP=STEP
35720		IF(YSTP.GT.1)GO TO 1203
35730		YSTP=0
35740		X=-1
35800	1203	JJX=X*5.120-256
35900		NX=YSTP*5.120-256
36000		NY=AMP*256.+128.
36100		IZ=Y*256.+128.
36200		CALL ALINE(JJX,IZ,NX,NY)
36300		CALL DPYOUT(1)
36400	12	Y=AMP
36500		X=YSTP
36600		A(KT,1)=Y
36700	CC	A(KT,2)=X
36750		A(KT,2)=STEP
36800	7001	KT=KT+1
36900	C   KT COUNTS SEGMENTS
37000		IF(STEP.LT.100)GO TO 504
37100		GO TO 201
37200	
37800	7000	IF(ISMOO)GO TO 201
37900		IF(KT.LE.20)GO TO 7007
38000		TYPE 7008
38100		GO TO 509
38200	7008	FORMAT(' NO MORE THAN 20 SEGS IN CURVES'/)
38300	7007	CALL SSS(A,KT-1,FUNC)
38400	C   DRAWS GRID 2
38500	7009	CALL DPY(FUNC,2)
38600		A(KT-1,2)=520
38700		ISMOO=-1
38800	C  SO YOU CAN'T COME BACK 2 TIMES
38900		GO TO 201
39000		END